EKS+RDS(MySQL5.7)+Flaskをeksctlで既存VPCに構築してみる
おはようございます、もきゅりんです。
先日、Flask+RDS(MySQL5.7)+FargateをCFnで構築してみるを書いたのですが、ほんじゃEKSではどうやんの?と思ったので、何千番煎じなのか知らないですがやってみました。
今回使うサンプルで使うFlaskとk8sのManifestファイルはこちらです。
所要時間: 約20~25分
所要時間ですが、クラスターが作成されるのに15~20分くらい。
その間にRDSを作成しましょう。これは5分くらい。
余った10~15分はくつろぎましょう。
クラスターができたら、残りは数分で完了するので約25分です。
前提条件
- 利用予定のアカウントで、AWS CLIが利用可能
-
kubectlがインストールされていること (kubectlのバージョンは作成するk8sクラスタのバージョンと合わせておきましょう)
-
eksctlがインストールされていること
全く本番運用を想定していないので、できる限りシンプルにして、余分な課金されないように自分はデフォルトVPCで構築しました。
そのため、サブネットがすべてパブリックであり、設計としては望ましくありません。
実際の運用では、弊社記事3個のパラメータでEKSクラスタをサクッと構築するクイックスタートの紹介でも紹介されているようなアーキテクチャがより適切だと考えます。
クラスターの作成
eksctlを使います。
yamlファイルを使ってクラスターを作成します。
デフォルトVPCに存在するパブリックサブネット3つを使って作成しています。
なお、t2.micro1つの場合、Podを1つしか作成できないため、t2.microを2つで実行していますことご注意下さい。
yamlの中身については上記公式ページをご参照下さい。
eksctl create cluster -f cluster.yaml
しばらくかかるので、その間にRDSを作成します。
RDS(MySQL)の作成
export SECURITY_GROUP_NAME=mysql-from-default-vpc export RDS_DATABASE_NAME=demo-flask-mysql export DB_NAME=flask_db export USER_NAME=YOUR_NAME export USER_PASSWORD=YOUR_PASSWORD
# セキュリティグループ(以下sg)の作成 SECURITY_GROUP_ID=`aws ec2 create-security-group \ --description ${SECURITY_GROUP_NAME} \ --group-name ${SECURITY_GROUP_NAME} \ | jq -r '.GroupId'`
# YOUR_VPC_CIDRから3306を開放するルールを作成 aws ec2 authorize-security-group-ingress \ --group-id ${SECURITY_GROUP_ID} \ --protocol tcp \ --port 3306 \ --cidr YOUR_VPC_CIDR
# DBを作成 aws rds create-db-instance \ --db-instance-identifier ${RDS_DATABASE_NAME} \ --db-name ${DB_NAME} \ --vpc-security-group-ids ${SECURITY_GROUP_ID} \ --allocated-storage 20 \ --db-instance-class db.t2.micro \ --engine mysql \ --engine-version 5.7 \ --master-username ${USER_NAME} \ --master-user-password ${USER_PASSWORD}
しばらくしたらエンドポイントを確認しましょう。
表示されたら控えます。
aws rds describe-db-instances \ --db-instance-identifier ${RDS_DATABASE_NAME}
デプロイ
rds/serviceのエンドポイントにRDSのエンドポイントを更新して
rds/secretsにbase64でエンコードしたユーザ名とパスワードを更新。
echo -n ${USER_NAME} | base64 echo -n ${USER_PASSWORD} | base64
# 環境確認 kubectl config current-context kubectl get nodes
# マニフェスト実行 kubectl apply -f rds/ kubectl apply -f flask/
# 確認 kubectl get svc,po
特に問題なさそうならELBのエンドポイントを取得してポート8000で表示しましょう。
xxxxxx.ap-northeast-1.elb.amazonaws.com:8000
いつもの出てくる...
以上です。 どなたかのお役に立てれば幸いです。
参考
Kubernetes, Local to Production with Django: 5— Deploy to AWS using Kops with RDS Postgres